package cuatroenraya.jugadores;

import java.util.ArrayList;
import java.util.Random;

import com.sun.java.swing.plaf.motif.resources.motif;

import cuatroenraya.Jugador;

public class JugadorAlumnoG25 extends Jugador {

	private ArrayList<Movimiento> posiblesMoves;

	public static final int FichaO = -1;
	public static final int FichaX = 1;
	public static final int JUEGA_ALUMNO = 0;
	static final int VALOR_VICTORIA = 9999;

	static final int PESOS_CELDA[][] = { { 1, 1, 2, 2, 2, 2, 1, 1 },
			{ 1, 2, 2, 3, 3, 2, 2, 1 }, { 2, 2, 3, 4, 4, 3, 2, 2 },
			{ 2, 3, 4, 5, 5, 4, 3, 2 }, { 2, 3, 4, 5, 5, 4, 3, 2 },
			{ 2, 2, 3, 4, 4, 3, 2, 2 }, { 1, 2, 2, 3, 3, 2, 2, 1 },
			{ 1, 1, 2, 2, 2, 2, 1, 1 } };

	@Override
	public int[] jugar(int[][] tablero) {
		

		ArrayList<Movimiento> posiblesMoves = posiblesMoves(tablero);
		ArrayList<Movimiento> weithMoves = calcularPesoMove(tablero,
				posiblesMoves);
		

		double peso = 0;
		Movimiento move = null;
		for (Movimiento movimiento : weithMoves) {
			if (movimiento != null && movimiento.getPeso() > peso) {
				peso = movimiento.getPeso();
				move = movimiento;
			}
		}
		System.out.println(toStringTablero(weithMoves));

		
		int[] jugada = new int[2];
		jugada[0] = move.getX();
		jugada[1] = move.getY();
		return jugada;
	}

	private int asignarPesoMovimiento(int[][] tablero, Movimiento jugada) {
		int vert = 0;
		int horiz = 0;
		int diag45 = 0;
		int diag135 = 0;
		int ficha = tablero[jugada.getX()][jugada.getY()];
		int peso = 0;
		// JOptionPane.showMessageDialog(null,jugada[0] + " " + jugada[1] +
		// " Jugador " + ficha);
		for (int i = 0; i < 7; i++) { // for(i = jugada[1]-3; i<=jugada[1]+3;
										// i++)
			// Los if controlan que los subindices no se salgan de rango, el
			// resto se hace con los contadores de los "?"

			if (jugada.getX() + i - 3 < 8 && jugada.getX() + i - 3 >= 0) {
				vert = (tablero[jugada.getX() + i - 3][jugada.getY()] == ficha) ? (vert + 1)
						: (0);
			} else {
				vert = 0;
			}
			if (jugada.getY() + i - 3 < 8 && jugada.getY() + i - 3 >= 0) {
				horiz = (tablero[jugada.getX()][jugada.getY() + i - 3] == ficha) ? (horiz + 1)
						: (0);
			} else {
				horiz = 0;
			}
			if (jugada.getX() + i - 3 < 8 && jugada.getX() + i - 3 >= 0
					&& jugada.getY() + i - 3 < 8 && jugada.getY() + i - 3 >= 0) {
				diag45 = (tablero[jugada.getX() + i - 3][jugada.getY() + i - 3] == ficha) ? (diag45 + 1)
						: (0);
			} else {
				diag45 = 0;
			}
			if (jugada.getX() - i + 3 < 8 && jugada.getX() - i + 3 >= 0
					&& jugada.getY() + i - 3 < 8 && jugada.getY() + i - 3 >= 0) {
				diag135 = (tablero[jugada.getX() - i + 3][jugada.getY() + i - 3] == ficha) ? (diag135 + 1)
						: (0);
			} else {
				diag135 = 0;
			}
			if(ficha==-1){
				if (horiz==3){
					horiz=horiz+40;
				}
				if(vert==3){
					vert=vert+40;
				}
				if(diag135==3){
					diag135=diag135+40;
				}
				if(diag45==3){
					diag45=diag45+40;
				}
			}
			if(ficha==1){
				if (horiz==4){
					horiz=horiz+20;
				}
				if(vert==4){
					vert=vert+20;
				}
				if(diag135==4){
					diag135=diag135+20;
				}
				if(diag45==4){
					diag45=diag45+20;
				}
			}
			peso=horiz+vert+diag135+diag45;

		}
		return peso;
	}

	

	private ArrayList<Movimiento> posiblesMoves(int[][] tablero) {
		posiblesMoves = new ArrayList<Movimiento>();
		for (int i = 0; i < tablero.length; i++) {
			for (int j = 0; j < tablero.length; j++) {
				if (tablero[i][j] == 0) {
					Movimiento move = new Movimiento(i, j);
					posiblesMoves.add(move);
				}
			}
		}
		return posiblesMoves;
	}

	private ArrayList<Movimiento> calcularPesoMove(int[][] tablero,
			ArrayList<Movimiento> posiblesMoves) {
		ArrayList<Movimiento> pesosMoveTemp = new ArrayList<Movimiento>();

		for (Movimiento movimiento : posiblesMoves) {
			int[][] tableroTmp = copiarTablero(tablero);
			movimiento.setPeso(asignarPesoMovimiento(tableroTmp, movimiento));
			pesosMoveTemp.add(movimiento);
		}

		return pesosMoveTemp;
	}

	private int[][] copiarTablero(int[][] tablero) {
		int[][] tableroTmp = new int[8][8];
		for (int i = 0; i < tablero.length; i++) {
			for (int j = 0; j < tablero.length; j++) {
				tableroTmp[i][j] = tablero[i][j];
			}

		}
		return tableroTmp;
	}

	

	public int hay4enRaya(int[][] tablero) {
		int i, j, k, iAux, iAux2, iCont, iCont2;
		// Horizontales
		for (j = 0; j < 8; j++) {
			iAux = 0;
			iCont = 0;
			for (i = 0; i < 8; i++) {
				if (tablero[i][j] == iAux)
					iCont += iAux;
				else {
					iCont = 0;
					iAux = tablero[i][j];
				}
				if (iCont == 3) {
					return this.FichaX;
				} else if (iCont == -3) {
					return this.FichaO;
				}
			}
		}
		// Verticales
		for (i = 0; i < 8; i++) {
			iAux = 0;
			iCont = 0;
			for (j = 0; j < 8; j++) {
				if (tablero[i][j] == iAux)
					iCont += iAux;
				else {
					iCont = 0;
					iAux = tablero[i][j];
				}
				if (iCont == 3) {
					return this.FichaX;
				} else if (iCont == -3) {
					return FichaO;
				}
			}
		}
		// Diagonales
		for (k = 0; k < 8; k++) {
			iAux = 0;
			iCont = 0;
			iAux2 = 0;
			iCont2 = 0;
			if (k <= 2) {
				i = 0;
			} else {
				i = k - 2;
			}
			if (k >= 2) {
				j = 0;
			} else {
				j = 2 - k;
			}
			for (; (j < 8) && (i < 8); i++, j++) {
				if (tablero[i][j] == iAux) {
					iCont += iAux;
				} else {
					iCont = 0;
					iAux = tablero[i][j];
				}
				if (tablero[i][7 - j] == iAux2) {
					iCont2 += iAux2;
				} else {
					iCont2 = 0;
					iAux2 = tablero[i][7 - j];
				}
				if ((iCont == 3) || (iCont2 == 3)) {
					return this.FichaX;
				} else if ((iCont == -3) || (iCont2 == -3)) {
					return this.FichaO;
				}
			}
		}
		return JUEGA_ALUMNO;
	}
	
	private String toStringTablero(ArrayList<Movimiento>movimientos){
		StringBuffer sb = new StringBuffer();
		int pesos[][]= new int [8][8];
		for (Movimiento movimiento : movimientos) {
			pesos[movimiento.getX()][movimiento.getY()]=movimiento.getPeso();
		}
		for (int i = 0; i < pesos.length; i++) {
			sb.append("\n");
			for (int j = 0; j < pesos.length; j++) {
				if(pesos[i][j]==0){
					sb.append(" "+pesos[i][j]+",");	
				}else{
					sb.append("   ,");
				}
			}
			
		}
		
		return sb.toString();
	}

}
